package beans;

import pool.*;
import java.util.*;
import java.sql.*;

/**
 * @author Antonin Mozzati
 * @author Yannick Schürter
 */
public class ListeTagNouvelle {

    private ArrayList<TagNouvelleBean> listeTagNouvelle;
    JDCConnectionDriver driver;
    Connection connexion;

    public ListeTagNouvelle(JDCConnectionDriver driver) throws Exception {
	this.driver = driver;
    }

    // Retourne la liste des tags de Nouvelle actuellement dans la base
    public ArrayList<TagNouvelleBean> getListeTagNouvelle() {
	PreparedStatement ps;
	listeTagNouvelle = new ArrayList<TagNouvelleBean>();
	try {
	    this.connexion = driver.connect("jdbc:jdc:jdcpool", null);

	    ps = connexion.prepareStatement("SELECT * FROM app.tags_nouvelles");
	    ResultSet rs = ps.executeQuery();
	    while (rs.next()) {
		TagNouvelleBean tag = new TagNouvelleBean(
			new Integer(rs.getString(1)),
			rs.getString(2));
		listeTagNouvelle.add(tag);
	    }
	    ps.close();

	} catch (Exception e) {
	    System.out.println("Pb fermeture: " + e.getMessage());
	    e.printStackTrace();
	}
	return listeTagNouvelle;
    }

    public void addTagNouvelle(TagNouvelleBean tn, NouvelleBean nb) {
	try {
	    this.connexion = driver.connect("jdbc:jdc:jdcpool", null);
	    PreparedStatement ps;
            int insertID;
            // Si aucun tag portant le même nom n'existe, on le crée
            if (!this.contains(tn)) {
                System.out.println("Ajout du tag " + tn.getNomTagNouvelle());
                // Insertion du tag en lui-même dans la table des tags
                ps = connexion.prepareStatement("Insert into app.tags_Nouvelles (nomTagNouvelle) VALUES ("
                        + "'" + tn.getNomTagNouvelle().replace("'","''") + "')", Statement.RETURN_GENERATED_KEYS);
                ps.executeUpdate();

                // Récupération de l'id du tag générée à l'insertion
                ResultSet keys = ps.getGeneratedKeys();
                keys.next();  
                insertID = keys.getInt(1);
                System.out.println("Insert ID du tag : "+insertID);
            // Si un tag portant le même nom existe, on récupère son id
            } else {
                insertID = tn.getId_tagNouvelle();
            }
            
            // Insertion de l'id du tag et de la nouvelle dans la table de jointure
            ps = connexion.prepareStatement("Insert into app.tags_nouvelles_match (id_tagnouvelle, id_nouvelle) VALUES ("
		    + insertID + ", "+nb.getId_nouvelle()+")");
	    ps.executeUpdate();
	    System.out.println("Tag " + tn.getNomTagNouvelle() + " ajouté avec succès.");
	    ps.close();
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }

    public void removeTag(int id) {
	try {
	    this.connexion = driver.connect("jdbc:jdc:jdcpool", null);
	    PreparedStatement ps;
	    System.out.println("Suppression du tag d'id " + id);
	    ps = connexion.prepareStatement("DELETE FROM app.tags_nouvelles WHERE ID_TAGNouvelle=" + id);
	    ps.executeUpdate();
	    System.out.println("Tag " + id + " retiré avec succès.");
	    ps.close();
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }

    public ArrayList<TagNouvelleBean> getByNouvelle(int id_nouvelle) {
	PreparedStatement ps;
	listeTagNouvelle = new ArrayList<TagNouvelleBean>();
	try {
	    this.connexion = driver.connect("jdbc:jdc:jdcpool", null);

	    ps = connexion.prepareStatement("SELECT app.tags_nouvelles.* FROM app.tags_nouvelles, app.tags_nouvelles_match"
                    + " WHERE app.tags_nouvelles.id_tagnouvelle = app.tags_nouvelles_match.id_tagnouvelle"
                    + " AND app.tags_nouvelles_match.id_nouvelle="+id_nouvelle);
	    ResultSet rs = ps.executeQuery();
	    while (rs.next()) {
		TagNouvelleBean tag = new TagNouvelleBean(
			new Integer(rs.getString(1)),
			rs.getString(2));
		listeTagNouvelle.add(tag);
	    }
	    ps.close();

	} catch (Exception e) {
	    System.out.println("Pb fermeture: " + e.getMessage());
	    e.printStackTrace();
	}
	return listeTagNouvelle;
    }
    
     public boolean contains(TagNouvelleBean tb) {
        for(TagNouvelleBean tn : this.getListeTagNouvelle()) {
            if (tn.getNomTagNouvelle().equals(tb.getNomTagNouvelle())) {
                tb.setId_tagNouvelle(tn.getId_tagNouvelle());
                return true;
            }
        }
        return false;
    }

}
